From ee694618a7384afe8d5dfbab28a6b400ce28711d Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 6 Dec 2005 15:52:51 +0100 Subject: [PATCH] Add map_domain_pages/unmap_domain_pages to map contiguous multi-franme extents of domain memory. Signed-off-by: Keir Fraser --- xen/arch/x86/x86_32/domain_page.c | 20 +++++++++++++------- xen/include/xen/domain_page.h | 19 +++++++++++-------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/x86_32/domain_page.c b/xen/arch/x86/x86_32/domain_page.c index 7b091d9869..f7c194b775 100644 --- a/xen/arch/x86/x86_32/domain_page.c +++ b/xen/arch/x86/x86_32/domain_page.c @@ -40,10 +40,10 @@ static void flush_all_ready_maps(void) cache[i] = l1e_empty(); } -void *map_domain_page(unsigned long pfn) +void *map_domain_pages(unsigned long pfn, unsigned int order) { unsigned long va; - unsigned int idx, cpu = smp_processor_id(); + unsigned int idx, i, flags, cpu = smp_processor_id(); l1_pgentry_t *cache = mapcache; #ifndef NDEBUG unsigned int flush_count = 0; @@ -72,10 +72,15 @@ void *map_domain_page(unsigned long pfn) local_flush_tlb(); shadow_epoch[cpu] = ++epoch; } + + flags = 0; + for ( i = 0; i < (1U << order); i++ ) + flags |= l1e_get_flags(cache[idx+i]); } - while ( l1e_get_flags(cache[idx]) & _PAGE_PRESENT ); + while ( flags & _PAGE_PRESENT ); - cache[idx] = l1e_from_pfn(pfn, __PAGE_HYPERVISOR); + for ( i = 0; i < (1U << order); i++ ) + cache[idx+i] = l1e_from_pfn(pfn+i, __PAGE_HYPERVISOR); spin_unlock(&map_lock); @@ -83,11 +88,12 @@ void *map_domain_page(unsigned long pfn) return (void *)va; } -void unmap_domain_page(void *va) +void unmap_domain_pages(void *va, unsigned int order) { - unsigned int idx; + unsigned int idx, i; ASSERT((void *)MAPCACHE_VIRT_START <= va); ASSERT(va < (void *)MAPCACHE_VIRT_END); idx = ((unsigned long)va - MAPCACHE_VIRT_START) >> PAGE_SHIFT; - l1e_add_flags(mapcache[idx], READY_FOR_TLB_FLUSH); + for ( i = 0; i < (1U << order); i++ ) + l1e_add_flags(mapcache[idx+i], READY_FOR_TLB_FLUSH); } diff --git a/xen/include/xen/domain_page.h b/xen/include/xen/domain_page.h index f20e3f28c3..ce152aece2 100644 --- a/xen/include/xen/domain_page.h +++ b/xen/include/xen/domain_page.h @@ -10,19 +10,22 @@ #include #include +#define map_domain_page(pfn) map_domain_pages(pfn,0) +#define unmap_domain_page(va) unmap_domain_pages(va,0) + #ifdef CONFIG_DOMAIN_PAGE /* - * Maps a given page frame, returning the mmap'ed virtual address. The page is - * now accessible until a corresponding call to unmap_domain_page(). + * Maps a given range of page frames, returning the mapped virtual address. The + * pages are now accessible until a corresponding call to unmap_domain_page(). */ -extern void *map_domain_page(unsigned long pfn); +extern void *map_domain_pages(unsigned long pfn, unsigned int order); /* - * Pass a VA within a page previously mapped with map_domain_page(). - * That page will then be removed from the mapping lists. + * Pass a VA within the first page of a range previously mapped with + * map_omain_pages(). Those pages will then be removed from the mapping lists. */ -extern void unmap_domain_page(void *va); +extern void unmap_domain_pages(void *va, unsigned int order); #define DMCACHE_ENTRY_VALID 1U #define DMCACHE_ENTRY_HELD 2U @@ -84,8 +87,8 @@ domain_mmap_cache_destroy(struct domain_mmap_cache *cache) #else /* !CONFIG_DOMAIN_PAGE */ -#define map_domain_page(pfn) phys_to_virt((pfn)<